home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / PVIEW95.PAK / MISC.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  4KB  |  152 lines

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993-1995  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   misc.c
  9. //
  10. //  PURPOSE:  Contains all helper functions "global" to the application.
  11. //
  12. //  FUNCTIONS:
  13. //    CenterWindow   - Center one window over another.
  14. //      DrawResizeLine - Handles drawing the resizing line while it is being 
  15. //                       moved
  16. //
  17. //  COMMENTS:
  18. //
  19. //
  20.  
  21. #include <windows.h>            // required for all Windows applications
  22. #include <windowsx.h>
  23. #include "globals.h"            // prototypes specific to this application
  24.  
  25.  
  26.  
  27. //
  28. //  FUNCTION: CenterWindow(HWND, HWND)
  29. //
  30. //  PURPOSE:  Center one window over another.
  31. //
  32. //  PARAMETERS:
  33. //    hwndChild - The handle of the window to be centered.
  34. //    hwndParent- The handle of the window to center on.
  35. //
  36. //  RETURN VALUE:
  37. //
  38. //    TRUE  - Success
  39. //    FALSE - Failure
  40. //
  41. //  COMMENTS:
  42. //
  43. //    Dialog boxes take on the screen position that they were designed
  44. //    at, which is not always appropriate. Centering the dialog over a
  45. //    particular window usually results in a better position.
  46. //
  47.  
  48. BOOL CenterWindow(HWND hwndChild, HWND hwndParent)
  49. {
  50.     RECT    rcChild, rcParent;
  51.     int     cxChild, cyChild, cxParent, cyParent;
  52.     int     cxScreen, cyScreen, xNew, yNew;
  53.     HDC     hdc;
  54.  
  55.     // Get the Height and Width of the child window
  56.     GetWindowRect(hwndChild, &rcChild);
  57.     cxChild = rcChild.right - rcChild.left;
  58.     cyChild = rcChild.bottom - rcChild.top;
  59.  
  60.     // Get the Height and Width of the parent window
  61.     GetWindowRect(hwndParent, &rcParent);
  62.     cxParent = rcParent.right - rcParent.left;
  63.     cyParent = rcParent.bottom - rcParent.top;
  64.  
  65.     // Get the display limits
  66.     hdc = GetDC(hwndChild);
  67.     cxScreen = GetDeviceCaps(hdc, HORZRES);
  68.     cyScreen = GetDeviceCaps(hdc, VERTRES);
  69.     ReleaseDC(hwndChild, hdc);
  70.  
  71.     // Calculate new X position, then adjust for screen
  72.     xNew = rcParent.left + ((cxParent - cxChild) / 2);
  73.     if (xNew < 0)
  74.     {
  75.         xNew = 0;
  76.     }
  77.     else if ((xNew + cxChild) > cxScreen)
  78.     {
  79.         xNew = cxScreen - cxChild;
  80.     }
  81.  
  82.     // Calculate new Y position, then adjust for screen
  83.     yNew = rcParent.top  + ((cyParent - cyChild) / 2);
  84.     if (yNew < 0)
  85.     {
  86.         yNew = 0;
  87.     }
  88.     else if ((yNew + cyChild) > cyScreen)
  89.     {
  90.         yNew = cyScreen - cyChild;
  91.     }
  92.  
  93.     // Set it, and return
  94.     return SetWindowPos(hwndChild,
  95.                         NULL,
  96.                         xNew, yNew,
  97.                         0, 0,
  98.                         SWP_NOSIZE | SWP_NOZORDER);
  99. }
  100.  
  101.  
  102.  
  103. //
  104. //  FUNCTION: DrawResizeLine(HWND, LONG)
  105. //
  106. //  PURPOSE:  Draws a transparent line while the resizing line is being
  107. //              moved.
  108. //
  109. //  PARAMETERS:
  110. //    hwnd      - window where the resizing line is being drawn
  111. //    yPos      - vertical position to draw the line at
  112. //
  113. //  RETURN VALUE:
  114. //      nothing
  115. //
  116. //  COMMENTS:
  117. //
  118. //    This function draws using the R2_NOT style so the line is made up
  119. //    of the reverse of the pixels it is over.  This function also handles
  120. //    removing the line due to the R2_NOT style since it just reverses
  121. //      the pixels.  
  122. //
  123.  
  124. void DrawResizeLine(HWND hwnd, LONG yPos)
  125. {
  126.     HPEN hPen, hPenOld;        // pen for line and previous pen
  127.     HDC hdc;                // window's HDC
  128.     RECT rc;                // window client rectangle
  129.  
  130.     // Create a pen to draw the resizing line with
  131.     hPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 0));
  132.  
  133.     // get the window's client area so we know how wide to make the line
  134.     GetClientRect(hwnd, &rc);
  135.  
  136.     hdc = GetDC(hwnd);                    // get the window's DC
  137.     hPenOld = SelectObject(hdc, hPen);    // use the pen we just created
  138.     SetROP2(hdc, R2_NOT);                // just invert the pixels
  139.  
  140.     MoveToEx(hdc, 0, yPos, NULL);
  141.     LineTo(hdc, rc.right, yPos);
  142.  
  143.     // clean up after ourselves
  144.     SelectObject(hdc, hPenOld);            // put the old pen back
  145.     SetROP2(hdc, R2_NOP);                   // reset the ROP2 code
  146.     ReleaseDC(hwnd, hdc);
  147.         
  148.     DeleteObject(hPen);                    // delete the pen
  149. }
  150.  
  151.  
  152.